home *** CD-ROM | disk | FTP | other *** search
/ Linux Cubed Series 8: LINUX Games / Linux Cubed Series 8 - LINUX Games.iso / games / video / fly8111-.000 / fly8111- / fly8 / COMMON / plsound.c < prev    next >
C/C++ Source or Header  |  1979-12-31  |  5KB  |  274 lines

  1. /* --------------------------------- plsound.c ------------------------------ */
  2.  
  3. /* This is part of the flight simulator 'fly8'.
  4.  * Author: Eyal Lebedinsky (eyal@ise.canberra.edu.au).
  5. */
  6.  
  7. /* A generic play-list Sound device driver. You need to supply your own
  8.  * start/stop functions.
  9. */
  10.  
  11. #include "fly.h"
  12. #include "plsound.h"
  13.  
  14. #define    QSIZE    32
  15. #define PLSE    ((struct plsextra FAR *)Snd->extra)
  16.  
  17. LOCAL_FUNC int NEAR
  18. PlsCommand (BEEP *b)
  19. {
  20.     int    l, ret;
  21.  
  22. again:
  23.     for (ret = 1; ret && (l = b->list[0]) < 0;) {
  24.         switch (l) {
  25.         default:
  26.         case -1:            /* END */
  27.             ret = 0;
  28.             break;
  29.         case -2:            /* GOTO,address */
  30.             b->list += 2*b->list[1];
  31.             break;
  32.         case -3:            /* REPEAT,address,n,cnt */
  33.             if (b->list[3]) {
  34.                 if (--b->list[3])    /* Nth time */
  35.                     b->list += 2*b->list[1];
  36.                 else            /* done */
  37.                     b->list += 2*2;
  38.             } else {            /* start */
  39.                 b->list[3] = b->list[2];
  40.                 b->list += 2*b->list[1];
  41.             }
  42.             break;
  43.         }
  44.     }
  45.     if (ret) {
  46.         b->freq = *b->list++;
  47.         b->milli = *b->list++/4;
  48.         if (!b->milli)
  49.             goto again;
  50.     }
  51.  
  52.     return (ret);
  53. }
  54.  
  55. extern void FAR
  56. PlsPoll (int force)
  57. {
  58.     int    i, diff, highest, next;
  59.     BEEP    *b;
  60.  
  61.     if (!PLSE->beeps)
  62.         return;
  63.  
  64.     if (!PLSE->nbeeps) {
  65.         PLSE->lasttime = st.lasttime;
  66.         return;
  67.     }
  68.     if (!force && PLSE->nexttime > st.lasttime)
  69.         return;
  70.  
  71.     diff = (int)(st.lasttime - PLSE->lasttime);
  72.     PLSE->lasttime = st.lasttime;
  73.     
  74.     highest = 0;
  75.     next = 0x7fff;
  76.     for (i = 0; i < QSIZE; ++i) {
  77.         b = PLSE->beeps+i;
  78.         if (!b->milli)
  79.             continue;
  80.         if (b->milli <= diff) {
  81.             if (b->list && PlsCommand (b))
  82.                 goto use_it;
  83.             b->milli = 0;
  84.             --PLSE->nbeeps;
  85.             continue;
  86.         }
  87.         b->milli -= diff;
  88. use_it:
  89.         if (b->freq > highest)
  90.             highest = b->freq;
  91.         if (next > b->milli)
  92.             next = b->milli;
  93.     }
  94.     if (highest) {
  95.         if (highest != PLSE->playing) {
  96.             if (PLSE->playing)
  97.                 PLSE->Stop ();
  98.             PLSE->playing = highest;
  99.             PLSE->Start (PLSE->playing);
  100.         }
  101.     } else if (PLSE->playing) {
  102.         PLSE->Stop ();
  103.         PLSE->playing = 0;
  104.     }
  105.     PLSE->nexttime = st.lasttime + next;
  106. }
  107.  
  108. LOCAL_FUNC int NEAR
  109. PlsAlloc (int f, int milli, int *list)
  110. {
  111.     int    i;
  112.     BEEP    *b;
  113.  
  114.     if (!PLSE->beeps)
  115.         return (-1);
  116.  
  117.     if (f <= 0)
  118.         f = 440;
  119.  
  120.     PlsPoll (0);
  121.     for (i = QSIZE; --i >= 0;) {
  122.         b = PLSE->beeps+i;
  123.         if (b->milli)
  124.             continue;
  125.         b->freq = f;
  126.         b->milli = milli;
  127.         if (NULL != (b->list_id = list))
  128.             b->list = list+2;
  129.         else
  130.             b->list = NULL;
  131.         ++PLSE->nbeeps;
  132.         break;
  133.     }
  134.     if (i >= 0)
  135.         PlsPoll (1);
  136.     return (i);
  137. }
  138.  
  139. extern int FAR
  140. PlsBeep (int f, int milli)
  141. {
  142.     if (!PLSE->beeps)
  143.         return (-1);
  144.     return (PlsAlloc (f, milli, 0));
  145. }
  146.  
  147. extern int FAR
  148. PlsList (int *list, int command)
  149. {
  150.     int    i;
  151.     BEEP    *b;
  152.  
  153.     if (!PLSE->beeps)
  154.         return (-1);
  155.     if (SND_OFF == command) {
  156.         for (i = 0; i < QSIZE; ++i) {
  157.             b = PLSE->beeps+i;
  158.             if (!b->milli)
  159.                 continue;
  160.             if (list && list != b->list_id)
  161.                 continue;
  162.             b->list = b->list_id = 0;
  163.         }
  164.         PlsPoll (1);
  165.         return (0);
  166.     }
  167.     if (*list < 0 || !(list[1]/4))
  168.         return (-1);
  169.     return (PlsAlloc (list[0], list[1]/4, list));
  170. }
  171.  
  172. extern int FAR
  173. PlsEffect (int eff, int command, ...)
  174. {
  175.     va_list        ap;
  176.     int        arg;
  177.     int        ret;
  178.  
  179.     ret = -1;
  180.  
  181.     if (SND_PARMS == command) {
  182.         va_start (ap, command);
  183.         switch (eff) {
  184.         case EFF_ENGINE:
  185.             arg = va_arg (ap, int);
  186.             TnEngine[0] = arg;
  187.             ret = 0;
  188.             break;
  189.         default:
  190.             break;
  191.         }
  192.         va_end (ap);
  193.     } else if (SND_ON == command || SND_OFF == command) {
  194.         switch (eff) {
  195.         case EFF_HIT:
  196.             ret = PlsBeep (1414, 50);
  197.             break;
  198.         case EFF_M61_SHOOT:
  199.             ret = PlsBeep (1000, 10);
  200.             break;
  201.         case EFF_MK82_EXPLODE:
  202.             ret = PlsBeep (1414, 50);
  203.             break;
  204.         case EFF_MK82_SHOOT:
  205.             ret = PlsBeep (1000, 10);
  206.             break;
  207.         case EFF_NO_POINTER:
  208.             ret = PlsBeep (440*3, 500);
  209.             break;
  210.         case EFF_BEEP:
  211.             ret = PlsBeep (880, 100);
  212.             break;
  213.         case EFF_MSG:
  214.             ret = PlsList (TnMsg, command);
  215.             break;
  216.         case EFF_ENGINE:
  217.             ret = PlsList (TnEngine, command);
  218.             break;
  219.         case EFF_GONE:
  220.             ret = PlsList (TnGone, command);
  221.             break;
  222.         case EFF_HELLO:
  223.             ret = PlsList (TnHello, command);
  224.             break;
  225.         case EFF_NOTICE:
  226.             ret = PlsList (TnNotice, command);
  227.             break;
  228.         case EFF_GEAR:
  229.             ret = PlsList (TnGear, command);
  230.             break;
  231.         case EFF_ALARM:
  232.             ret = PlsList (TnAlarm, command);
  233.             break;
  234.         case EFF_WARN:
  235.             ret = PlsList (TnWarn, command);
  236.             break;
  237.         case EFF_DAMAGE:
  238.                 ret = PlsList (TnDamage, command);
  239.             break;
  240.         default:
  241.             break;
  242.         }
  243.     }
  244.     return (ret);
  245. }
  246.  
  247. extern int FAR
  248. PlsInit (char *options)
  249. {
  250.     if (!PLSE->beeps) {
  251.         if (F(PLSE->beeps = (BEEP *)memory_calloc (QSIZE,
  252.             sizeof (*(PLSE->beeps)))))
  253.                 return (-1);
  254.     }
  255.     memset (PLSE->beeps, 0, QSIZE * sizeof (*(PLSE->beeps)));
  256.     PLSE->playing = 0;
  257.     PLSE->nbeeps = 0;
  258.     PLSE->lasttime = PLSE->nexttime = st.lasttime;
  259.  
  260.     PLSE->Stop ();
  261.     return (0);
  262. }
  263.  
  264. extern void FAR
  265. PlsTerm (void)
  266. {
  267.     PLSE->beeps = memory_cfree (PLSE->beeps, QSIZE,
  268.                         sizeof (*(PLSE->beeps)));
  269.     PLSE->Stop ();
  270. };
  271.  
  272. #undef QSIZE
  273. #undef PLSE
  274.